package scene.manager;

import type.data.QueueStruct;
import type.data.StackStruct;
import android.graphics.Bitmap;

import com.gles.framework.ActivityMediator;

import device.graphics.GraphicsDevice;
import device.input.InputDevice;


/**
 * シーン管理クラス
 *
 * @author function
 */
public class SceneManager implements SceneMediator
{
	/** シーンスタック */
	private StackStruct<IScene>		m_sceneStack;

	/** シーンIDのスタック */
	private QueueStruct<Integer>	m_sceneIDQueue;

	/** activityにアクセスするための仲介者 */
	private ActivityMediator		m_mediator;

	/** シーンのポップ用ID */
	private static final int		POP = -1;

	/**
	 * コンストラクタ
	 */
	public SceneManager( ActivityMediator mediator )
	{
		// シーンスタックの生成
		m_sceneStack = new StackStruct<IScene>();
		m_sceneIDQueue = new QueueStruct<Integer>();


		m_mediator = mediator;
	}

	/**
	 * 初期化
	 */
	public void initialize()
	{
		//初期シーンの生成
		m_sceneStack.push( createScene( SceneFactory.TEXTURE ) );
	}

	/**
	 * シーンの更新処理
	 *
	 * @param inputDevice 入力デバイス
	 */
	public void sceneUpdate( InputDevice inputDevice )
	{
		IScene currentScene = m_sceneStack.get();
		currentScene.update( inputDevice );
	}

	/**
	 * シーンの描画
	 *
	 * @param graphicsDevice グラフィックデバイス
	 */
	public void sceneDraw( GraphicsDevice graphicsDevice )
	{
		IScene currentScene = m_sceneStack.get();
		currentScene.draw( graphicsDevice );
	}

	/**
	 * 終了
	 */
	public void finish()
	{
		IScene currentScene = m_sceneStack.get();
		currentScene.finish();
	}

	/**
	 * シーンを変更するかどうか
	 *
	 * @return trueならば変更する
	 */
	public boolean isSceneChange()
	{
		return !( m_sceneIDQueue.isEmpty() );
	}

	/**
	 * シーンの変更
	 */
	public void sceneChange()
	{
		// シーンIDが空になるまで
		while( m_sceneIDQueue.isEmpty() )
		{
			int id = m_sceneIDQueue.pop();

			// 削除用のIDかどうか
			if( isDelete( id ) )
			{
				IScene scene = m_sceneStack.pop();
				scene.finish();
				continue;
			}

			// 削除用のIDでない場合は新規にシーンを生成してスタックに積み込む
			m_sceneStack.push( createScene( id ) );
		}
	}

	/**
	 * シーンの生成
	 *
	 * @param ID シーンID
	 * @return 生成したシーン（initializeが呼ばれている状態）
	 */
	private IScene createScene( int id )
	{
		IScene scene = SceneFactory.create( id, this );
		scene.initialize();
		return scene;
	}

	/**
	 * シーンIDが削除用のIDか判定を行う
	 *
	 * @param ID シーンID
	 * @return
	 */
	private boolean isDelete( int ID )
	{
		return ID == POP;
	}

	/**
	 * シーンをスタックに積み込む
	 *
	 * @param sceneID シーンID
	 */
	public void scenePush( int sceneID )
	{
		m_sceneIDQueue.push( sceneID );
	}

	/**
	 * シーンをスタックから下ろす
	 */
	public void scenePop()
	{
		m_sceneIDQueue.push( POP );
	}

	/**
	 * 画像の読み込み
	 *
	 * @param id 画像ID
	 * @return　bitmapクラス
	 */
	public Bitmap loadImage( int id )
	{
		return m_mediator.loadImage( id );
	}
}